home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dr. Windows 3
/
dr win3.zip
/
dr win3
/
PROGRAMR
/
OLE2BOOK.ZIP
/
CHAP06.ZIP
/
CHAP06
/
DATAUSER
/
DATAUSER.CPP
next >
Wrap
C/C++ Source or Header
|
1993-06-15
|
18KB
|
658 lines
/*
* DATAUSER.CPP
*
* A user of the Data Objects for Chapter 6
*
* Copyright (c)1993 Microsoft Corporation, All Rights Reserved
*
* Kraig Brockschmidt, Software Design Engineer
* Microsoft Systems Developer Relations
*
* Internet : kraigb@microsoft.com
* Compuserve: >INTERNET:kraigb@microsoft.com
*/
#define INITGUIDS
#include "datauser.h"
//These are for displaying clipboard formats textually.
static char * rgszCF[13]={"Unknown", "CF_TEXT", "CF_BITMAP", "CF_METAFILEPICT"
, "CF_SYLK", "CF_DIF", "CF_TIFF", "CF_OEMTEXT", "CF_DIB"
, "CF_PALETTE", "CF_PENDATA", "CF_RIFF", "CF_WAVE"};
static char szSuccess[] ="succeeded";
static char szFailed[] ="failed";
static char szExpected[] ="expected";
static char szUnexpected[] ="unexpected!";
/*
* WinMain
*
* Purpose:
* Main entry point of application.
*/
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hInstPrev
, LPSTR pszCmdLine, int nCmdShow)
{
MSG msg;
LPAPPVARS pAV;
#ifndef WIN32
SetMessageQueue(96);
#endif
//Create and initialize the application.
pAV=new CAppVars(hInst, hInstPrev, nCmdShow);
if (NULL==pAV)
return -1;
if (pAV->FInit())
{
while (GetMessage(&msg, NULL, 0,0 ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
delete pAV;
return msg.wParam;
}
/*
* DataUserWndProc
*
* Purpose:
* Window class procedure. Standard callback.
*/
LRESULT FAR PASCAL __export DataUserWndProc(HWND hWnd, UINT iMsg
, WPARAM wParam, LPARAM lParam)
{
HRESULT hr;
LPAPPVARS pAV;
HMENU hMenu;
FORMATETC fe;
WORD wID;
//This will be valid for all messages except WM_NCCREATE
pAV=(LPAPPVARS)GetWindowLong(hWnd, DATAUSERWL_STRUCTURE);
switch (iMsg)
{
case WM_NCCREATE:
//CreateWindow passed pAV to us.
pAV=(LPAPPVARS)((LONG)((LPCREATESTRUCT)lParam)->lpCreateParams);
SetWindowLong(hWnd, DATAUSERWL_STRUCTURE, (LONG)pAV);
return (DefWindowProc(hWnd, iMsg, wParam, lParam));
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
pAV->Paint();
break;
case WM_COMMAND:
SETDefFormatEtc(fe, 0, TYMED_HGLOBAL | TYMED_GDI | TYMED_MFPICT);
hMenu=GetMenu(hWnd);
wID=LOWORD(wParam);
switch (wID)
{
case IDM_OBJECTUSEDLL:
if (!pAV->m_fEXE)
break;
pAV->m_fEXE=FALSE;
pAV->FReloadDataObjects(TRUE);
break;
case IDM_OBJECTUSEEXE:
if (pAV->m_fEXE)
break;
pAV->m_fEXE=TRUE;
pAV->FReloadDataObjects(TRUE);
break;
case IDM_OBJECTDATASIZESMALL:
case IDM_OBJECTDATASIZEMEDIUM:
case IDM_OBJECTDATASIZELARGE:
CheckMenuItem(hMenu, IDM_OBJECTDATASIZESMALL, MF_UNCHECKED);
CheckMenuItem(hMenu, IDM_OBJECTDATASIZEMEDIUM, MF_UNCHECKED);
CheckMenuItem(hMenu, IDM_OBJECTDATASIZELARGE, MF_UNCHECKED);
CheckMenuItem(hMenu, wID, MF_CHECKED);
//Kill old advise.
if (NULL!=pAV->m_pIDataObject || 0!=pAV->m_dwConn)
pAV->m_pIDataObject->DUnadvise(pAV->m_dwConn);
if (IDM_OBJECTDATASIZELARGE==wID)
pAV->m_pIDataObject=pAV->m_pIDataLarge;
else if (IDM_OBJECTDATASIZEMEDIUM==wID)
pAV->m_pIDataObject=pAV->m_pIDataMedium;
else
pAV->m_pIDataObject=pAV->m_pIDataSmall;
//Setup new advise.
fe.cfFormat=pAV->m_cfAdvise;
pAV->m_pIDataObject->DAdvise(&fe, ADVF_NODATA
, pAV->m_pIAdviseSink, &pAV->m_dwConn);
break;
case IDM_OBJECTQUERYGETDATA:
if (NULL==pAV->m_pIDataObject)
break;
fe.tymed=TYMED_HGLOBAL | TYMED_GDI | TYMED_MFPICT;
pAV->TryQueryGetData(&fe, CF_TEXT, TRUE, 0);
pAV->TryQueryGetData(&fe, CF_BITMAP, TRUE, 1);
pAV->TryQueryGetData(&fe, CF_DIB, FALSE, 2);
pAV->TryQueryGetData(&fe, CF_METAFILEPICT, TRUE, 3);
pAV->TryQueryGetData(&fe, CF_WAVE, FALSE, 4);
break;
case IDM_OBJECTGETDATATEXT:
case IDM_OBJECTGETDATABITMAP:
case IDM_OBJECTGETDATAMETAFILEPICT:
if (NULL==pAV->m_pIDataObject)
break;
//Clean up whatever we currently have.
pAV->m_cf=0;
ReleaseStgMedium(&pAV->m_stm);
if (IDM_OBJECTGETDATATEXT==wID)
SETDefFormatEtc(fe, CF_TEXT, TYMED_HGLOBAL);
if (IDM_OBJECTGETDATABITMAP==wID)
SETDefFormatEtc(fe, CF_BITMAP, TYMED_GDI);
if (IDM_OBJECTGETDATAMETAFILEPICT==wID)
SETDefFormatEtc(fe, CF_METAFILEPICT, TYMED_MFPICT);
pAV->m_stm.tymed=fe.tymed;
hr=pAV->m_pIDataObject->GetData(&fe, &(pAV->m_stm));
if (SUCCEEDED(hr))
pAV->m_cf=fe.cfFormat;
InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);
break;
case IDM_OBJECTEXIT:
PostMessage(hWnd, WM_CLOSE, 0, 0L);
break;
case IDM_ADVISETEXT:
case IDM_ADVISEBITMAP:
case IDM_ADVISEMETAFILEPICT:
if (NULL==pAV->m_pIDataObject)
break;
//Terminate the old connection
if (0!=pAV->m_dwConn)
pAV->m_pIDataObject->DUnadvise(pAV->m_dwConn);
CheckMenuItem(hMenu, pAV->m_cfAdvise+IDM_ADVISEMIN, MF_UNCHECKED);
CheckMenuItem(hMenu, wID, MF_CHECKED);
//New format is wID-IDM_ADVISEMIN
pAV->m_cfAdvise=(UINT)(wID-IDM_ADVISEMIN);
fe.cfFormat=pAV->m_cfAdvise;
pAV->m_pIDataObject->DAdvise(&fe, ADVF_NODATA
, pAV->m_pIAdviseSink, &pAV->m_dwConn);
break;
case IDM_ADVISEGETDATA:
pAV->m_fGetData=!pAV->m_fGetData;
CheckMenuItem(hMenu, wID, pAV->m_fGetData ? MF_CHECKED : MF_UNCHECKED);
break;
case IDM_ADVISEREPAINT:
pAV->m_fRepaint=!pAV->m_fRepaint;
CheckMenuItem(hMenu, wID, pAV->m_fRepaint ? MF_CHECKED : MF_UNCHECKED);
break;
default:
break;
}
break;
default:
return (DefWindowProc(hWnd, iMsg, wParam, lParam));
}
return 0L;
}
/*
* CAppVars::CAppVars
* CAppVars::~CAppVars
*
* Constructor Parameters: (from WinMain)
* hInst HINSTANCE of the application.
* hInstPrev HINSTANCE of a previous instance.
* nCmdShow UINT specifying how to show the app window.
*
*/
CAppVars::CAppVars(HINSTANCE hInst, HINSTANCE hInstPrev, UINT nCmdShow)
{
m_hInst =hInst;
m_hInstPrev =hInstPrev;
m_nCmdShow =